package com.mowh.multithreading.active.object.active.active.object;

/**
 * @author mowh1gd
 * @create 2023/11/28 15:59
 */
class SchedulerThread extends Thread {
    /*
    SchedulerThread实现了producer-consumer模式
    invoke方法(名为调用)为producer角色，由ClientThread线程并发调用。
    run方法(内有名为执行的方法)为consumer角色，由SchedulerThread本身线程执行，实现调用与执行分离。
    ActivationQueue为channel角色，实现多线程操作，有守护控制。
    producer-consumer模式把MethodRequest(MakeString和DisplayString两种)请求实例通过channel(ActivationQueue)安全地从ClientThread(Maker和Display两种)线程传递给Consumer线程(SchedulerThread)。
     */

    private final ActivationQueue queue;

    public SchedulerThread(ActivationQueue queue) {
        this.queue = queue;
    }
    public void invoke(MethodRequest request) {//调用：把请求（MakeStringRequest和DisplayStringRequest两种请求实例）放入队列。
        //这是MakerClientThread线程和DisplayClientThread线程并发调用的方法，是producer角色，用于提供工作请求。
        queue.putRequest(request);
    }
    @Override
    public void run() {//这是SchedulerThread线程本身执行的方法，是consumer角色，用于处理工作内容。
        while (true) {//自动循环先进先出调用执行器执行，没有进行特殊的调度。
            MethodRequest request = queue.takeRequest();
            request.execute();//执行：队列中取出请求，按请求类型执行各自内容。
        }
    }
}
